package cc.idoone.spring_boot_hello.jms;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.pool.PooledConnectionFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.connection.SingleConnectionFactory;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.jms.core.JmsTemplate;

import javax.jms.ConnectionFactory;

/**
 * @auther hemj
 * @since 2017/9/28
 */
//与 AMQP 冲突
//@Configuration
public class JmsConfig {

	/**
	 * 真正可以产生Connection 的ConnectionFactory，由对应的 JMS服务厂商提供
	 */
	@Bean
	@ConfigurationProperties("spring.activemq")
	public ConnectionFactory targetConnectionFactory() {
		return new ActiveMQConnectionFactory();
	}

	@Bean
	@ConfigurationProperties("spring.activemq.pool")
	public ConnectionFactory pooledConnectionFactory(@Qualifier("targetConnectionFactory") ConnectionFactory targetConnectionFactory) {
		PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory();
		pooledConnectionFactory.setConnectionFactory(targetConnectionFactory);
		return pooledConnectionFactory;
	}

	@Bean
	public ConnectionFactory connectionFactory(@Qualifier("pooledConnectionFactory") ConnectionFactory pooledConnectionFactory) {
		SingleConnectionFactory singleConnectionFactory = new SingleConnectionFactory();
		singleConnectionFactory.setTargetConnectionFactory(pooledConnectionFactory);
		return singleConnectionFactory;
	}

	/**
	 * Spring 提供的 JMS工具类，它可以进行消息发送、接收等
	 */
	@Bean
	public JmsTemplate jmsTemplate(@Qualifier("connectionFactory") ConnectionFactory connectionFactory) {
		JmsTemplate jmsTemplate = new JmsTemplate();
		jmsTemplate.setConnectionFactory(connectionFactory);
		//jmsTemplate.setDefaultDestinationName("");
		return jmsTemplate;
	}

	@Bean
	public JmsMessagingTemplate jmsMessagingTemplate(JmsTemplate jmsTemplate) {
		JmsMessagingTemplate jmsMessagingTemplate = new JmsMessagingTemplate();
		jmsMessagingTemplate.setJmsTemplate(jmsTemplate);
		// jmsMessagingTemplate.setDefaultDestinationName("");
		return jmsMessagingTemplate;
	}

	/**
	 * 在真正利用JmsTemplate 进行消息发送的时候，我们需要知道消息发送的目的地，即destination。
	 * 在Jms 中有一个用来表示目的地的Destination 接口，它里面没有任何方法定义，只是用来做一个标识而已。
	 * 当我们在使用JmsTemplate 进行消息发送时没有指定destination 的时候将使用默认的Destination。
	 * 默认Destination 可以通过在定义jmsTemplate bean 对象时通过属性defaultDestination
	 * 或defaultDestinationName 来进行注入， defaultDestinationName 对应的就是一个普通字符串
	 */

	@Bean
	public ActiveMQQueue destinationQueue() {
		return new ActiveMQQueue("mytest.queue");
	}

	@Bean
	public ActiveMQQueue responseQueue() {
		return new ActiveMQQueue("mytest.responseQueue");
	}
}
